13章 イーサリアム仮想マシン(EVM)
P.311〜
イーサリアム仮想マシン (Ethereum Virtual Machine)
まっさきに思い浮かぶのは Java Virtual Machine だな june29.icon
13.1 EVMとは何か
イーサリアムの構成要素のひとつ
グローバル分散コンピュータ
準チューリング完全状態マシン
ガスによる制限があるので「準」
スタックベースのアーキテクチャ
アドレスを指定してアクセス可能なデータコンポーネント
実行されるスマートコントラクトのバイトコードが読み込まれた、不変のプログラムコードROM
すべての領域が明示的にゼロに初期化された揮発性のメモリ
メモリと同様にゼロに初期化されたイーサリアムの状態の一部である永続ストレージ
https://gyazo.com/7345e3c70a35e5359b4c3cd5fdf05267
13.1.1 既存の技術との比較
EVM は単なる計算処理エンジン
スケジューリング機能を持たない
シングルスレッド
「システムインターフェイス」の処理や「ハードウェアのサポート」はない
13.1.2 EVM命令セット (バイトコード演算)
操作
算術演算とビット単位の論理演算
実行コンテクストに関する問い合わせ
スタック、メモリ、ストレージへのアクセス
制御フローに関する操作
ロギング、関数コール、その他の演算子
オペコードの種類
算術演算
スタック操作
処理フロー操作
システムに関連する操作
論理演算
環境に対する操作
ブロックに関連する操作
オペコードの実例
コピペしづらいしスクショも撮りにくかったので、いっしょに書籍を見ましょう june29.icon
13.1.3 イーサリアムのステート (状態)
ワールドステート (world state)
イーサリアムアドレスからアカウント account へのマッピング
イーサリアムアドレス
イーサ残高 balance
ナンス nonce
ストレージ storage
プログラムコード program code
トランザクションの途中でガス切れになると
ステートに変化は起こらない
送信者ナンスはインクリメントされる
送信者の残高は減る
ここを見ると EVM は、ワールドステートのサンドボックスと言える
13.1.4 SolidityのEVMバイトコードへのコンパイル
この章では solc コマンドを使う
code:example
$ solc --help
$ solc -o BytecodeDir --opcodes Example.sol
$ solc -o BytecodeDir --asm Example.sol
$ solc -o BytecodeDir --bin Example.sol
--asm オプションをつけてコンパイルすると .evm ファイルが生成される
「13.1.2 EVM命令セット」にあった一覧と突き合わせていけば
13.1.5 コントラクトのデプロイを行うコード
読んだけどよくわからんかった… june29.icon
デプロイメントバイトコード deployment bytecode
実行時バイトコード runtime bytecode
13.1.6 バイトコードの逆アセンブル
逆アセンブラいろいろ
Porosity
広く使われているオープンソースの逆コンパ イラ
Ethersplay
逆アセンブラ「Binary Ninja」の EVM プラグイン
IDA-Evm
逆アセンブラ「IDA」のEVMプラグイン
実際の処理をひとつずつ追っていく解説がある june29.icon
13.2 チューリング完全性とガス
イーサリアムには「スケジューラを持たず」「シングルスレッド」という性質がある
無限ループに陥ったらイーサリアム全体が利用不能になるということ
この停止性問題 halting problem を解決するのがガス
ガスによって EVM は準チューリング完全となっている
13.3 ガス
計算リソースとストレージリソースを測定するためのもの
イエローペーパーに記載されている例からいくつか紹介
2 つの数値を加算すると 3 ガスかかる
Keccak-256 ハッシュの計算には「30 ガス」+「ハッシュされる 256 ビットごとに 6 ガス」がかかる
トランザクションの送信には 21,000 ガスかかる
ガスの持つ二重の役割
「イーサリアムの変わりやすい価格」と「マイナーへの仕事の対価としての報酬」との間の緩衝
DoS 攻撃に対する防御策
13.3.1 実行中のガス会計
トランザクションの処理を進めながらガスを消費していく
途中で足りなくなったらトランザクションは停止し、ステートは元のままになる
そこまでにかかった費用は徴収される
トランザクションが完了したら、ガスは費用として徴収され、マイナーに支払われる
トランザクションが消費しきらずに余ったガスはトランザクションの送信者に払い戻される
13.3.2 ガス会計に関する考察
2016 年のハードフォーク (コードネーム Tangerine Whisle) は、コストの不一致を悪用する攻撃が原因 「現実世界のコスト」と「ガス費用」を連動させておかないと攻撃が成功してしまう
13.3.3 ガス費用対ガス価格
ガス費用は EVM 上の計算と利用されたストレージの計測単位であり、ガス自体はイーサを尺度とする価格を持っています。
トランザクション手数料 = 使用された総ガス量 * 支払いガス価格 (単位はイーサ)
ガス費用
特定の操作を実行するために必要なガスの単位数
ガス価格
トランザクションを送信する際に、ガスの単位当たりに支払う予定のイーサの量
13.3.3.1 ネガティブガス費用
コントラクトの削除 SELFDESTRUCT は 24,000 ガスが払い戻される
ストレージアドレスをゼロ以外の値からゼロ SSTORE [x] = 0に変更すると 15,000 ガスが払い戻される
13.3.4 ブロックガス上限
メインネットのブロックガス上限は、
原著執筆時点で 8,000,000 ガス
日本語翻訳時点で 10,000,000 ガス
13.3.4.1 ブロックガスの上限は誰が決定するのか?
マイナーが投票できる仕組みになっている
13.4 まとめ
この章では、さまざまなスマートコントラクトの実行を追い、EVM がどのようにバイトコードを実行するかを見て、イーサリアム仮想マシンについて詳しく調べました。私たちはまた、EVM の会計メカニズムであるガスを見て、停止性問題をどのように解決し、イーサリアムを DoS 攻撃からどのように保護しているかを見ました。続く14 章では、イーサリアムが分散化されたコンセンサスを達成するために用いている仕組みを見ていきます。
参考資料
Ethereum EVM illustrated (exploring some mental models and implementations)
hr.icon
次章!